package com.zsr.example.service.impl;

import com.zsr.example.service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Service;

import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * @author zhousiren
 * @date 2021/12/25 14:04
 */
@Service
public class RedisServiceImpl implements RedisService {
    @Autowired
    private StringRedisTemplate redisTemplate;


    public void hyperLogAdd(String key, String value) {
        redisTemplate.opsForHyperLogLog().add(key, value);
    }
    public void hyperLogUnion(String key1,String key2){
        redisTemplate.opsForHyperLogLog().union(key1,key2);
    }

    public int hyperLogGet(String key) {
        return redisTemplate.opsForHyperLogLog().size(key).intValue();
    }
    public void hyperLogDel(String key) {
        redisTemplate.opsForHyperLogLog().delete(key);
    }

    public String opsForValueGet(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    public void opsForValueSet(String key,String value,Long timeOut, TimeUnit unit) {
        redisTemplate.opsForValue().set(key, value,timeOut,unit);
    }

    /**
     * 使用Sorted Set记录keyword
     * zincrby命令，对于一个Sorted Set，存在的就把分数加x(x可自行设定)，不存在就创建一个分数为1的成员
     *
     * @param keyword 搜索关键词
     */
    @Override
    public void searchZincrby(String keyword) {
        // 名为sortedSetName的Sorted Set不用预先创建，不存在会自动创建，存在则向里添加数据
        String sortedSetName = "searchHotWord";
        // x 增量
        double x = 1.0;
        redisTemplate.opsForZSet().incrementScore(sortedSetName, keyword, x);
    }

    /**
     * zrevrange命令, 查询Sorted Set中指定范围的值
     * 返回的有序集合中，score大的在前面
     * zrevrange方法无需担心用于指定范围的start和end出现越界报错问题
     *
     * @param start 查询范围开始位置
     * @param end   查询范围结束位置
     * @return
     */
    @Override
    public Set<ZSetOperations.TypedTuple<String>> queryTopSearchHotWord(Integer start, Integer end) {
        String sortedSetName = "searchHotWord";
        Set<ZSetOperations.TypedTuple<String>> resultSet = redisTemplate.opsForZSet().reverseRangeWithScores(sortedSetName, start, end);
        return resultSet;
    }

}
